// 网页内有通用部分 , 用作公共js
// 成功返回的code
const SUCCESS = "00000000";
let auth_user = {};
$(function () {
    // jq初始化
    if (navigator.appName == 'Microsoft Internet Explorer') {
        if (navigator.userAgent.indexOf("MSIE 5.0") > 0 || navigator.userAgent.indexOf("MSIE 6.0") > 0 || navigator.userAgent.indexOf("MSIE 7.0") > 0) {
            alert('您使用的 IE 浏览器版本过低, 推荐使用 Chrome 浏览器或 IE8 及以上版本浏览器.');
        }
    }
    // 展示右上角名称
    showUser();

    // 说明是表格
    let list = $("#list").val();
    console.log("表格列表对象: "+JSON.stringify(list))
    if (list !== undefined && list !== {}) {
        // 初始化表格之前
        beforeInitTable();

        // 初始化表格
        initTable();

        // 初始化左上角的按钮方法
        initBtn();
    }
});

function initTable() {
    //1.初始化Table
    let oTable = new TableInit();
    oTable.Init(columns);
}

// 初始化左上角的按钮组事件,需要定制化一些
function initBtn() {
    //2.初始化Button的点击事件
    let oButtonInit = new ButtonInit();
    oButtonInit.Init();

    customerInitBtn();
}

// 请求登出
function logout() {
    // 请求路径,然后重定向
    // 请求生成后立即分配处理程序，请记住该请求针对 jqxhr 对象
    $.post("/zjfAuthUserInfo/logout", function (data) {
        if (data.RSPCD === SUCCESS) {
            errorMsg("注销成功", type.SUCCESS);
            setTimeout(function () {
                window.location.href = "/login";
            }, 1000);
        } else {
            errorMsg(data.RSPMSG, type.DANGER);
        }
    });
}

// 每次发送请求前校验一下页面存储的用户是否存在
// (可以发送请求到后台校验,这里简单校验存在了)
// 如果不存在,需要重定向到登录页面
function validateUser() {
    let user = localStorage.getItem("USER");
    if (user == undefined) {
        window.location.href = "/login";
    }
}

// 展示右上角的用户名称
function showUser() {
    // 如果找不到这个值,那么就需要重新登录了
    let user = localStorage.getItem("USER");
    if (user == undefined) {
        window.location.href = "/login";
    } else {
        auth_user = toJsonObj(user);
        $("#admin").text(auth_user.NAME);
    }
}

function showList() {
    $("#ListNav").addClass("active");
    $("#AddNav").removeClass("active");

    $("#add").css("display", "none");
    $("#table #list").css("display", "");
    // version页面测试
    $("#table .bootstrap-table").css("display", "inline-block");
}

// 展示添加
function showAdd() {
    $("#ListNav").removeClass("active");
    $("#AddNav").addClass("active");

    $("#add").css("display", "inline");
    $("#table #list").css("display", "");
    $("#table .bootstrap-table").css("display", "none");
}

// 公共的获取参数的方法
function confirmVal() {
    // 所有的val样式标签
    // 如果包含了radio类型,会直接覆盖前者...2020年06月29日10:05:03 zjf
    let inputs = $("#add .val");
    let param = {};
    for (let input of inputs) {
        let ipt = $(input);
        // 如果当前类型是单选框,但是并未选中,继续走
        if (ipt.attr("type") != undefined
            && ipt.attr("type").toLowerCase() === "radio"
            && !ipt.attr("checked")) {
            continue
        }
        let name = ipt.attr("name").toUpperCase();
        // 如果有radio应该选择当前标签为selected
        let value = ipt.val().trim();
        if (value === "") {
            value = null;
        }
        param[name] = value;
    }
    add(param);
}

// 不清楚radio 的值
function clearVal() {
    // 清空id为add下面所有的带有val 样式的属性的值
    let inputs = $("#add .val");
    for (let input of inputs) {
        let type = $(input).attr("type");
        // console.log("--------------------")
        // console.log(input.tagName);
        if (type != null
            && type != undefined
            && type.toLowerCase() === "radio") {
            continue;
        }
        if (input.tagName.toLowerCase() === "select") {
            // 如果是select 那也不重置了
            continue;
        }
        $(input).val("");
    }
    defaultSet();
}

//静默刷新表格数据
function silenceRefresh(tableId) {
    $('#' + tableId).bootstrapTable('refresh', {
        silent: true
    });
}

// Important 添加成功之后刷新表格
function addResult(data) {
    if (SUCCESS === data.RSPCD) {
        errorMsg("添加成功", type.SUCCESS);
        silenceRefresh("list");
    } else {
        errorMsg(data.RSPMSG, type.DANGER)
    }
}

// Important 最简单的公共响应操作,只做提示
function simpleResponse(data) {
    if (SUCCESS === data.RSPCD) {
        errorMsg("操作成功", type.SUCCESS);
    } else {
        errorMsg(data.RSPMSG, type.DANGER)
    }
}

function delResult(data) {
    if (SUCCESS === data.RSPCD) {
        errorMsg("删除成功", type.SUCCESS);
        silenceRefresh("list");
    } else {
        errorMsg(data.RSPMSG, type.DANGER)
    }
}

// 判断是手机端还是pc端
function phoneOrPc() {
    let sUserAgent = navigator.userAgent.toLowerCase();
    let bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
    let bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
    let bIsMidp = sUserAgent.match(/midp/i) == "midp";
    let bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
    let bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
    let bIsAndroid = sUserAgent.match(/android/i) == "android";
    let bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
    let bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
    if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) {
        return false;
    } else {
        return true;
    }
}

// ---------------------初始化table---------------------
let TableInit = function () {
    console.log("初始化table")
    let oTableInit = {};
    oTableInit.Init = function (columns) {
        $("#list").bootstrapTable({
            url: urlQuery,  //请求后台的URL（*）
            method: 'POST',                     //请求方式（*）
            searchTimeOut: 3000,                //请求超时时间
            toolbar: '#toolbar',                //工具按钮用哪个容器
            striped: true,                      //是否显示行间隔色
            cache: false,                       //是否使用缓存，默认为true，所以一般情况下需要设置一下这个属性（*）
            pagination: true,                   //是否显示分页（*）
            paginationHAlign: "right",          //指定 分页条 在水平方向的位置。’left’ or ‘right’
            paginationVAlign: "bottom",         //指定 分页条 在垂直方向的位置。’top’ or ‘bottom’ or ‘bonth’
            paginationPreText: "上一页",         //指定分页条中上一页按钮的图标或文字
            paginationNextText: "下一页",        //指定分页条中下一页按钮的图标或文字
            maintainSelected: true,             //开启分页保持选择状态，就是用户点击下一页再次返回上一页
            paginationUseIntermediate: true,    //计算并显示中间页面以便快速访问。
            showPaginationSwitch: false,        //是否显示 数据条数选择框(显示,关闭分页条的)
            paginationLoop: false,              //分页循环 关闭
            onlyInfoPagination: false,          //必须设置成false才能显示分页条 !!!!!!!
            smartDisplay: false,                //显示5 10 50 这个
            sortable: true,                     //是否启用排序
            sortOrder: "asc",                   //排序方式 asc desc
            queryParams: oTableInit.queryParams,//传递参数（*）
            queryParamsType: "limit",           //传递参数（*）
            sidePagination: "server",           //分页方式：client客户端分页，server服务端分页（*）
            pageNumber: 1,                      //初始化加载第一页，默认第一页
            pageSize: 10,                       //每页的记录行数（*）
            pageList: [10, 20, 50, 100, 'ALL'], //可供选择的每页的行数（*）
            strictSearch: false,                //false模糊搜索
            showColumns: true,                  //是否显示所有的列
            showRefresh: true,                  //是否显示刷新按钮
            minimumCountColumns: 2,             //最少允许的列数
            searchOnEnterKey: false,            //回车触发搜索
            visibleSearch: false,               //设置true 为仅在可见列/数据中搜索，如果数据包含其他未显示的值，则在搜索时将忽略它们。
            showSearchButton: false,            //设置true 为在搜索输入后面显示搜索按钮。仅在按下按钮时才会执行搜索（例如，以防止交通或加载时间）。
            showSearchClearButton: true,        //设置true为在搜索输入后面显示一个清除按钮，该按钮将清除搜索输入（还包括来自过滤器控件的所有过滤器（如果启用））。
            trimOnSearch: true,                 //设置true 为修剪搜索字段中的空格。
            search: true,                       //是否显示表格搜索，此搜索是客户端搜索，不会进服务端，所以，个人感觉意义不大
            clickToSelect: customerClickToSelect,               //是否启用点击选中行
            height: 600,                        //行高，如果没有设置height属性，表格自动根据记录条数觉得表格高度
            uniqueId: "ID",                     //每一行的唯一标识，一般为主键列
            showToggle: false,                  //是否显示详细视图和列表视图的切换按钮
            cardView: false,                    //是否显示详细视图
            detailView: false,                  //是否显示父子表
            singleSelect: false,                //设置True 将禁止多选
            classes: 'table-no-bordered',        //删除表格边框
            customSearch: function (text) {
                console.log("执行自定义搜索") // 完全没卵用
                console.log(text) //
                /*return data.filter(function (row) {
                    return row.field.indexOf(text) > -1;
                });*/
                return this.data;
            },
            formatLoadingMessage: function () {   //显示正在加载文案
                showLoading();
                return "";
            },
            onPageChange: function (number, size) {
                // 分页事件
                showLoading();
            },
            onPostBody: function (data) {
                // 表格渲染前事件,不需要
            },
            onRefresh: function (params) {
                //刷新事件
                showLoading();
            },
            responseHandler: function (res) {   // 请求服务器返回的数据data
                // console.log(res)
                if (SUCCESS === res.RSPCD) {
                    let data = {
                        "limit": res.LIMIT,
                        "offset": res.OFFSET,
                        "search": res.SEARCH,
                        "sort": res.SORT,
                        "order": res.ORDER,
                        "rows": res.BODY.LIST,
                        "total": res.TOTAL
                    }
                    hideLoading();
                    return data;
                } else {
                    // 弹窗提示账号或者密码错误啥的
                    errorMsg(res.RSPMSG, type.DANGER)
                    hideLoading();
                }
            },
            rowStyle: function (row, index) {
                //bootstrap table支持5中表格的行背景色，分别是’active’, ‘success’, ‘info’, ‘warning’, 'danger’这五种，
                // 至于每种对应的背景颜色，将代码运行起来就可看到。关于这个方法的返回值，
                // 按照bootstrap table的规则，必须返回一个json格式的对象型如： { classes: strclass }
                let number = index % 5;
                return {classes: rowStyle[number]}
            },
            onSort: function (name, order) {
                // name是列名,order 是 desc 或者 asc
                console.log("自定义排序");
                console.log(name);
                console.log(order);
                showLoading();
                /*********第3步，刷新排序字段和排序方法，完成************/
                // $('#list').bootstrapTable('refreshOptions', {
                //     sortName: name,
                //     sortOrder: order
                // });
                // silenceRefresh("list");
            },
            onEditableSave: function (field, row, oldValue, $el) {//编辑单元格事件
                // 如果新的值跟旧值一致,那么就不修改了
                if (row[field] === oldValue) {
                    errorMsg("没有改动", type.INFO)
                    return;
                }
                // 组装请求参数
                let param = {};
                param["ID"] = row["ID"];
                param[field] = row[field];
                // 同步修改请求之后,返回刷新
                ajax(urlEdit, param);
                // silenceRefresh("list");
            },
            onCheck: function (row, $element) { // 选中行事件
                console.log("选中行事件")
                // console.log(row)    // 选中标签内容
                // console.log($element) // 标签对象
            },
            onUncheck: function (row, $element) { // 取消选中事件
                console.log("取消选中事件")
                // console.log(row)   // 取消选中标签内容
                // console.log($element) // 标签对象
            },
            onCheckAll: function (rowsAfter, rowsBefore) {// 全选事件
                console.log("全选中事件")
                // console.log(rowsAfter) // 全部选中之后的数据 list
                // console.log(rowsBefore) // 全部选中之前的数据 list
            },
            onUncheckAll: function (rowsAfter, rowsBefore) {// 取消全选事件
                console.log("取消全选事件")
                // console.log(rowsAfter) //  取消选中之后的 list
                // console.log(rowsBefore) // 取消选中之前的 list
            },
            columns: columns,
            //>>>>>>>>>>>>>>导出excel表格设置
            showExport: phoneOrPc(), //是否显示导出按钮(此方法是自己写的目的是判断终端是电脑还是手机,电脑则返回true,手机返回falsee,手机不显示按钮)
            exportDataType: 'basic', //basic', 'all', 'selected'.
            // exportTypes: ['json', 'xml', 'csv', 'txt', 'sql', 'excel'], //导出类型
            exportTypes: ['excel', 'xlsx'], //导出类型
            //exportButton: $('#btn_export'), //为按钮btn_export 绑定导出事件 自定义导出按钮(可以不用)
            exportOptions: {
                ignoreColumn: [0, 0], //忽略某一列的索引
                fileName: '数据导出-'+customer_sheet_name(), //文件名称设置
                worksheetName: 'Sheet1', //表格工作区名称
                tableName: '导出数据表-'+customer_sheet_name(),
                excelstyles: ['background-color', 'color', 'font-size', 'font-weight'],
                //onMsoNumberFormat: DoOnMsoNumberFormat
            }
            //导出excel表格设置<<<<<<<<<<<<<<<<
        });
    };

    // {search: "", sort: undefined, order: "asc", offset: 10, limit: 5}
    // {search: "", sort: "PARENT", order: "desc", offset: 0, limit: 10}
    // {search: "sadsd", sort: "NAME", order: "asc", offset: 0, limit: 100}
    oTableInit.queryParams = function (params) {
        console.log("表格查询传递参数:")
        console.log(params)
        let searchVal = $(".fixed-table-toolbar .search-input").val();
        let temp = {
            "PAGE_CAPACITY": params.limit,   //页面大小
            "PAGE_OFFSET": params.offset,  //数据偏移量,比如第一页是页码1,每页5,第二页这个数据就是10
            "SORT_TYPE": params.order, // 排序方式
            "SORT_NAME": params.sort, // 排序列名
            "SEARCH": StringUtil.isEmpty(searchVal) ? null : searchVal.trim(), // 搜索内容
        };
        // 这里要获取一些自定义的请求参数
        let param = getCustomerParam();
        if (param === null || param === undefined || param.length === 0) {
            // 这里可以忽略
        } else {
            for (let it of param) {
                temp[it.K] = it.V;
            }
        }
        console.log("最终查询参数:")
        console.log(temp)
        // 注意这里要转换成json
        return toJsonStr(temp);
    };
    return oTableInit;
};

// 初始化按钮的事件
let ButtonInit = function () {
    let oInit = {};

    oInit.Init = function () {
        //初始化页面上面的按钮事件
        $("#btn_add").click(function () {
            errorMsg("点击添加按钮", type.INFO)
        });

        $("#btn_delete").click(function () {
            // 获取选中的数据行
            let rows = $('#list').bootstrapTable('getSelections');
            // 如果没有选中数据
            if (rows.length < 1) {
                errorMsg("没有选中任何记录", type.INFO)
                return;
            }
            // 非阻塞确认框....
            bootbox.confirm("确认删除这" + rows.length + "条记录吗?", function (result) {
                if (result) {
                    // 可能不同的页面删除的对应唯一条件不同,这里放在不同的js中
                    delRecord(rows);
                } else {
                }
            });
        });

        // class的子类选择也要用空格
        $(".fixed-table-toolbar .search-input").keydown(function (event) {
            if (event.which === 13) {
                console.log("按下了回车键搜索");
                silenceRefresh("list");
            }
        })

    };
    return oInit;
};

// 行背景色
const rowStyle = ['active', 'success', 'info', 'warning', 'danger'];
// ---------------------初始化table完毕---------------------
